//  使用条件变量控制线程执行次序
#include <iostream>
#include <vector>
#include <unistd.h>
using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *ThreadExec(void *argv)
{
    u_int64_t num = (u_int64_t)argv;
    string outInfo = "thread" + to_string(num);
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    cout << outInfo << endl;
    pthread_mutex_unlock(&mutex);
    return nullptr;
}

int main()
{
    vector<pthread_t> tids;
    for (u_int64_t i = 0; i < 5; i++)
    {
        pthread_t tid;
        pthread_create(&tid, nullptr, ThreadExec, (void *)i);
        tids.push_back(tid);
        usleep(100);
        /*
        错开时间创建，达到按顺序执行线程函数的目的,
        并且创建的时间加长了不会因为执行过快导致没有signal而join阻塞
        */
    }

    // pthread_cond_broadcast(&cond);
    // // for (auto tid : tids)
    // // {
    // //     sleep(1);
    // //     pthread_cond_signal(&cond);
    // //     // pthread_join(tid, nullptr);
    // // }

    // for (auto tid : tids)
    // {
    //     // pthread_cond_signal(&cond);
    //     pthread_join(tid, nullptr);
    // }


    // for (auto tid : tids)
    // {
    //     pthread_cond_signal(&cond);
    //     // pthread_join(tid, nullptr);
    // }
    for (auto tid : tids)
    {
        pthread_cond_signal(&cond);
        pthread_join(tid, nullptr);
    }
    return 0;
}